from sanic import Sanic,response
from service import myToken
from model import userModel,user_link_roleModel
import bcrypt

async def zxzlhello(request):

    return response.json({"hello":"world3"})



'''
用户注册
@ param:
request.form.username:用户名
request.form.tel:用户手机号
request.form.password:密码
request.form.SMSCode: 用户填写的验证码

@ return:
status
'''
async def userSignUp(request):
    # 用户填写验证码发送到后端接口
    # 读取用户填写的验证码和session中的验证码进行验证,
    # 验证成功返回给前端，然后前端刷新填写用户信息页面
    print('userSignUp接收到的信息：',request.form)
    tel = request.form.get('tel')  # 用户的手机号，作为uesr_id【用户的唯一标识】
    if tel:
            cSMSCode = request["session"].get(tel)
            print(cSMSCode)
            fSMSCode = request.form.get('SMSCode')  # 用户填写的验证码
            print(fSMSCode)
            if cSMSCode != fSMSCode:  # 先验证验证码，验证码错误返回错误
                print("短信验证码填写错误")
                return response.json({'status': 'error'})  # 验证码正确的话接着往下走
            username = request.form.get('username')
            passwd = request.form.get('passwd')
            passwd_hash=bcrypt.hashpw(passwd.encode('utf-8'),bcrypt.gensalt())
            new_usr = userModel.insert(tel=tel, username=username, passwd=passwd_hash)  # 将用户名密码和权限代码写入数据库中
            if new_usr:
                    new_ule = user_link_roleModel.insert(user_id=new_usr,role_id='9')  # 默认权限代码为游客
                    if new_ule:
                        return response.json({'status': 'success'})
                    else:
                        return response.json({"status":"role error"})
            else:
                    return response.json({'status': 'tel existed'})
    else:
            return response.json({'status': 'tel error'})


'''
用户登录（手机短信验证码方式），
成功返回success，并将jwt写入响应中，以后验证jwt即可
:param
request.form.tel:用户手机号
request.form.SMSCode: 用户填写的验证码
@:return
status
'''


async def loginSMSCode(request):
    print('userSignUp接收到的信息：', request.form)
    tel = request.form.get('tel')  # 用户的手机号，作为uesr_id【用户的唯一标识】
    cSMSCode = request["session"].get(tel)
    fSMSCode = request.form.get('SMSCode')  # 用户填写的验证码
    if cSMSCode!=fSMSCode:
        print("短信验证码失败")
        return response.json({'status': 'error'})  # 验证码正确的话接着往下走
    usr=userModel.select(tel)                # 读取数据库中用户角色和合同号         =================合同号未读取===================
    rid=[]
    rol_id=user_link_roleModel.select(user_id=usr['id'])  # 存在某个人有多种权限
    for i in rol_id:
            rid.append(i[1])
    head={'token':myToken.generateToken({'username':usr['username'],'tel':tel,'role':rid})}
    return response.json({'status':'success'},headers=head)

'''
用户登录（手机密码方式）
成功返回success,并将jwt写入响应中，以后验证jwt即可
:param
request.form.tel:用户手机号
request.form.password:密码
'''
async def loginPasswd(request):
    print('loginPasswd接收到的信息：', request.form)
    tel=request.form.get('tel')
    passwd=request.form.get('passwd')
    usr=userModel.select(tel)               # 读数据库,获取其中的密码
    if bcrypt.checkpw(passwd.encode('utf-8'), usr['passwd'].encode('utf-8')): # 明暗文二次运算对比
    # usr_passwd = bcrypt.hashpw(passwd.encode('utf-8'), usr['passwd'].encode('utf-8'))   # 明暗文二次运算对比 方法2
    # if usr['passwd'].encode('utf-8') == usr_passwd:
        rid = []
        rol_id = user_link_roleModel.select(user_id=usr['id'])  # 存在某个人有多种权限  ==========未读取合同信息========
        for i in rol_id:
                rid.append(i[1])
        head = {'token': myToken.generateToken({'username':usr['username'], 'tel': tel, 'role': rid})}
        return response.json({'status': 'success'}, headers=head)
    else:
        return response.json({'status':'error'})

'''
找回密码：步骤1.先输入手机号获取验证码  2.输入验证码进行验证 3.输入新的密码
成功返回success  错误返回 error
request.form.tel:用户手机号
request.form.password:用户填写密码
request.form.SMSCode: 用户填写的验证码

'''
async def findPasswd(request):
    print('findPasswd接收到的信息：', request.form)
    tel=request.form.get('tel')
    cSMSCode = request["session"].get(tel)
    fSMSCode = request.form.get('SMSCode')  # 用户填写的验证码
    if cSMSCode!=fSMSCode:
        print("短信验证码失败")
        return response.json({'status': 'error'})  # 验证码正确的话接着往下走
    passwd = request.form.get('passwd')
    # 读数据库,获取其中的密码
    passwd_hash = bcrypt.hashpw(passwd.encode('utf-8'), bcrypt.gensalt())
    #更新库中密码
    usr=userModel.update(tel=tel,new_passwd=passwd_hash)
    if usr:
        return response.json({'status': 'success'})
    else:
        return response.json({'status':'database error'})

'''
修改用户名
成功返回 success 错误返回 error
@:param
request.form.username:用户名
'''
async def modifyUsername(request,tel):
        print('modifyUsernaem收到的消息是：',request.form)
        new_username=request.form.get('username')
        usr = userModel.update(tel,new_username=new_username)
        if usr:
                return response.json({"status":"success"})
        else:
                return response.json({"status":"error"})

'''
修改密码  1.先验证原密码  2.输入新密码再加密储存
成功返回success 错误返回error
@:param
tel : 路由获取的操作用户手机号
request.form.password:密码
'''
async def modifyPasswd(request,tel):
        print('modifyPasswd收到的消息是：', request.form)
        passwd=request.form.get("passwd")
        usr = userModel.select(tel)
        if bcrypt.checkpw(passwd.encode('utf-8'),usr['passwd'].encode('utf-8')):
                new_password=request.form.get("new_passwd")
                new_password_hash = bcrypt.hashpw(new_password.encode('utf-8'),bcrypt.gensalt())   # 密码加密储存
                new_usr = userModel.update(tel=tel,new_passwd=new_password_hash)    # 加密后密码储存到数据库
                if new_usr:
                        return response.json({"status":"success"})
                else:
                        return response.json({"status":"error"})
        else:
                return response.json({"status":"passwd error"})
'''
修改手机号  1.进行密码验证  2. 进行新手机号的验证码发送 3.手机号验证码验证
成功返回success 错误返回error
@:param
tel: 路由获取的操作用户手机号
request.form.tel:用户新手机号
request.form.password:密码
request.form.SMSCode: 用户填写的验证码
'''
async def modifyTel(request,tel):
        print('modifyTel收到的消息是：', request.form)
        passwd=request.form.get("passwd")
        usr=userModel.select(tel)
        if bcrypt.checkpw(passwd.encode('utf-8'),usr['passwd'].encode('utf-8')):
        # usr_passwd = bcrypt.hashpw(passwd.encode('utf-8'), usr['passwd'].encode('utf-8'))   # 明暗文二次运算对比 方法2
        # if usr['passwd'].encode('utf-8') == usr_passwd:
                new_tel=request.form.get("new_tel")
                cSMSCode = request["session"].get(tel)
                fSMSCode = request.form.get('SMSCode')  # 用户填写的验证码
                if cSMSCode == fSMSCode:
                        new_usr=userModel.update(tel,new_tel=new_tel)
                        if new_usr:
                                return response.json({"status":"success"})
                        else:
                                return response.json({"status":"database error"})
                else:
                        return response.json({"status":"SMSCode error"})

        else:
                return response.json({"status":"passwd error"})
